// Order.java
package com.estore.model;

import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;


/**
 * 订单实体类
 * 用于表示用户的订单信息，包括订单ID、商品详情、总价、状态等属性。
 */
public class Order implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;

    // ... 其余代码保持不变


   /**
    * 订单状态枚举类
    * 定义了订单可能的状态及其描述信息。
    */
   public enum OrderStatus implements Serializable {
       PENDING_PAYMENT("待付款"),
       PAID("已付款"),
       SHIPPING("配送中"),
       COMPLETED("已完成"),
       CANCELLED("已取消");

       private final String description;

       /**
        * 构造方法
        * @param description 状态的中文描述
        */
       OrderStatus(String description) {
           this.description = description;
       }

    /**
     * 获取状态描述
     * @return 状态的中文描述
     */
    public String getDescription() {
        return description;
    }

    /**
     * 返回状态的描述字符串
     * @return 状态描述
     */
    @Override
    public String toString() {
        return description;
    }
}


    private final String orderId;              // 订单ID
    private final String userId;               // 用户ID
    private final Map<String, Integer> items;  // 商品ID和数量的映射
    private final double totalPrice;           // 总价
    private OrderStatus status;          // 订单状态
    private final LocalDateTime createTime;    // 创建时间
    private LocalDateTime updateTime;    // 更新时间

    /**
     * 构造方法
     * 初始化订单对象，设置默认状态为待付款，并记录创建时间和更新时间。
     * @param orderId 订单ID
     * @param userId 用户ID
     * @param items 商品ID与数量的映射关系
     * @param totalPrice 订单总价
     */
    public Order(String orderId, String userId, Map<String, Integer> items, double totalPrice) {
        this.orderId = orderId;
        this.userId = userId;
        this.items = items;
        this.totalPrice = totalPrice;
        this.status = OrderStatus.PENDING_PAYMENT;
        this.createTime = LocalDateTime.now();
        this.updateTime = LocalDateTime.now();
    }

    // Getters and Setters
    /**
     * 获取订单ID
     * @return 订单ID
     */
    public String getOrderId() { return orderId; }

    /**
     * 获取用户ID
     * @return 用户ID
     */
    public String getUserId() { return userId; }

    /**
     * 获取商品ID与数量的映射
     * @return 商品ID与数量的映射
     */
    public Map<String, Integer> getItems() { return items; }

    /**
     * 获取订单总价
     * @return 订单总价
     */
    public double getTotalPrice() { return totalPrice; }

    /**
     * 获取订单状态
     * @return 当前订单状态
     */
    public OrderStatus getStatus() { return status; }

    /**
     * 设置订单状态并更新最后修改时间
     * @param status 新的订单状态
     */
    public void setStatus(OrderStatus status) {
        this.status = status;
        this.updateTime = LocalDateTime.now();
    }

    /**
     * 获取订单创建时间
     * @return 订单创建时间
     */
    public LocalDateTime getCreateTime() { return createTime; }

    /**
     * 获取订单最后更新时间
     * @return 订单最后更新时间
     */
    public LocalDateTime getUpdateTime() { return updateTime; }

    /**
     * 返回订单的字符串表示形式
     * 包含订单ID、用户ID、总价、状态和创建时间。
     * @return 订单信息的字符串表示
     */
    @Override
    public String toString() {
        return String.format("订单ID: %s | 用户ID: %s | 总价: ¥%.2f | 状态: %s | 创建时间: %s",
                           orderId, userId, totalPrice, status, createTime.toString());
    }

    /**
     * 判断两个订单是否相等
     * 根据订单ID判断两个订单对象是否相同。
     * @param o 要比较的对象
     * @return 如果订单ID相同则返回true，否则返回false
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Order order = (Order) o;
        return Objects.equals(orderId, order.orderId);
    }

    /**
     * 计算订单的哈希码
     * 基于订单ID计算哈希值。
     * @return 订单的哈希码
     */
    @Override
    public int hashCode() {
        return Objects.hash(orderId);
    }
}
